package com.bbf.springbootdemo.feature;

import com.bbf.springbootdemo.util.BaseUtil;

/**
 * 分页组件类
 * <p>注意所有序号从1开始</p>
 * @author BBF
 */
public final class Pager extends BaseBean {
  private static final long serialVersionUID = 9220964138114854274L;

  /**
   * 页编号 : 第几页
   */
  private int pageNo = 1;

  /**
   * 页大小 : 每页的数量
   */
  private int pageSize = BaseUtil.DEFAULT_PAGE_SIZE;

  /**
   * 偏移量 : 第一条数据在表中的位置
   */
  private int offset;

  /**
   * 限定数 : 每页的数量
   */
  private int limit;

  /**
   * 总条数
   */
  private int totalCount = 0;

  /**
   * 构造函数
   */
  public Pager() {
    this.calcOffset();
    this.calcLimit();
  }

  /**
   * 构造函数
   * @param pageNo 页码
   * @param pageSize 每页数量
   */
  public Pager(final int pageNo, final int pageSize) {
    this.pageNo = pageNo > 0 ? pageNo : 1;
    this.pageSize = pageSize > 0 ? pageSize : 10;
    this.calcOffset();
    this.calcLimit();
  }

  /**
   * 构造函数
   * @param pageNo 页码
   * @param pageSize 每页数量
   * @param totalCount 总数
   */
  public Pager(final int pageNo, final int pageSize, final int totalCount) {
    this.pageNo = pageNo > 0 ? pageNo : 1;
    this.pageSize = pageSize > 0 ? pageSize : 10;
    this.setTotalCount(totalCount);
    this.calcOffset();
    this.calcLimit();
  }

  /**
   * 计算偏移量 LIMIT 3， 3; LIMIT offset， limit
   */
  private void calcOffset() {
    this.offset = (pageNo - 1) * pageSize;
    if (0 > this.offset) {
      this.offset = 0;
    }
  }

  /**
   * 计算限定数
   */
  private void calcLimit() {
    this.limit = pageSize;
  }

  /**
   * 获得当前页的页号，序号从1开始，默认为1
   * @return 当前页的页号，序号从1开始，默认为1
   */
  public int getPageNo() {
    return pageNo;
  }

  /**
   * 设置当前页的页号
   * @param pageNo 当前页的页号
   */
  public void setPageNo(final int pageNo) {
    this.pageNo = pageNo;
  }

  /**
   * 获得每页的记录数量，默认为1
   * @return 每页的记录数量，默认为1
   */
  public int getPageSize() {
    return pageSize;
  }

  public void setPageSize(final int pageSize) {
    this.pageSize = pageSize;
  }

  /**
   * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置，序号从1开始
   * @return 当前页第一条记录在总结果集中的位置，序号从1开始
   */
  public int getFirst() {
    return ((pageNo - 1) * pageSize) + 1;
  }

  /**
   * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置，序号从0开始
   * @return 当前页第一条记录在总结果集中的位置，序号从0开始
   */
  public int getOffset() {
    return offset;
  }

  /**
   * 获取每页的数量
   * @return 每页的数量
   */
  public int getLimit() {
    return limit;
  }

  /**
   * 取得总记录数， 默认值为-1
   * @return 总记录数， 默认值为-1
   */
  public int getTotalCount() {
    return totalCount;
  }

  /**
   * 设置总记录数
   * @param totalCount 总记录数
   */
  public void setTotalCount(final int totalCount) {
    this.totalCount = totalCount;
    if (totalCount < this.pageNo) {
      this.pageNo = totalCount;
    }
  }

  /**
   * 根据pageSize与totalCount计算总页数， 默认值为-1
   * @return 总页数， 默认值为-1
   */
  public int getTotalPages() {
    if (totalCount < 0) {
      return -1;
    }
    int pages = totalCount / pageSize;
    return totalCount % pageSize > 0 ? (++pages) : pages;
  }

}
